package personaje;

import nivel.*;
import logica.*;
import sprite.personajes.*;

/**
 * Clase abstracta utilizada para factorizar propiedades de los personajes
 * involucrados en el juego.
 * 
 * @author Agustin Orge (LU.85538)
 * @author Victoria Martinez de la Cruz (LU.87620)
 */
public abstract class Personaje implements EntidadConLogica {

	/** Nivel al que pertenece */
	protected Nivel nivel;

	/** El casillero en el que se encuentra el personaje */
	protected Casillero casilleroActual;

	/** Iconos del personaje */
	protected SpritePersonaje icono;

	/** Control para la caida del personaje */
	protected boolean estaCayendo;

	// Consultas
	/**
	 * Retorna el casillero en el que esta posicionado el personaje
	 * 
	 * @return casilleroActual
	 */
	public Casillero getCasilleroActual() {
		return casilleroActual;
	}

	/**
	 * Retorna el nivel en el que se encuentra el personaje
	 * 
	 * @return nivel
	 */
	public Nivel getNivel() {
		return nivel;
	}

	/**
	 * Retorna el icono del personaje
	 * 
	 * @return icono
	 */
	public SpritePersonaje getIcono() {
		return icono;
	}

	/**
	 * Retorna el control asociado al personaje
	 * 
	 * @return control
	 */
	public Logica getControl() {
		return nivel.getLogicaIA();
	}

	// Comandos

	/**
	 * Setea el casillero donde se encuentra el personaje
	 * 
	 * @param ca
	 *            casillero
	 */
	public void setCasillero(Casillero ca) {
		casilleroActual = ca;
	}

	/**
	 * Setea el nivel en el cual se encuentra el personaje
	 * 
	 * @param nivel
	 */
	public void setNivel(Nivel n) {
		nivel = n;
	}

	/**
	 * Metodo que se encarga de mover el personaje un casillero hacia la derecha
	 * tanto logicamente como graficamente
	 */
	public abstract void moverDerecha();

	/**
	 * Metodo que se encarga de mover el personaje un casillero hacia la
	 * izquierda tanto logicamente como graficamente
	 */
	public abstract void moverIzquierda();

	/**
	 * Metodo que se encarga de subir el personaje un casillero hacia la
	 * izquierda tanto logicamente como graficamente
	 */
	public void saltar() {

	}

	/**
	 * Metodo que se encarga de bajar el personaje un casillero hacia la
	 * izquierda tanto logicamente como graficamente
	 */
	public abstract void caer();

	/**
	 * Metodo encargado de informar al nivel que el personaje murio
	 */
	public void morir() {

	}

	@Override
	public boolean estaCayendo() {
		return estaCayendo;
	}

	@Override
	public void setCayendo(boolean c) {
		estaCayendo = c;
	}
}
